package co.edu.uniandes.ecos.itera.tsp.accesodatos;

import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.IOException;

import java.util.ArrayList;
import java.util.List;

import co.edu.uniandes.ecos.itera.tsp.mundo.Proyecto;

import co.edu.uniandes.ecos.itera.tsp.anotaciones.Avance;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.Avances;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.Loc;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.LogT;

/**
 * Capa de Acceso a datos para los Proyectos
 */
@Avances({
	@Avance(taskId=4, termino='S'),
	@Avance(taskId=14, termino='S')
})
@LogT(date="2011-03-13", min=25, taskId=4)
public class ProyectoDAL 
{
	/**
	 * Establece la ruta del archivo en donde se va a almacenar un Proyecto
	 */
	private String rutaArchivoPersistencia = "./datos/Proyectos";
	
	/**
	 * Almacena los proyectos del Sistema
	 * @param proyectos Proyectos a almacenar
	 * @throws Exception Puede arrojar una excepcion al tratar de almacenar los proyectos del Sistema
	 */
	@Loc(size=10, taskId=4)
	public void almacenar(List<Proyecto> proyectos) throws Exception
	{
		try
		{
		    ObjectOutputStream accesoADatos = new ObjectOutputStream( new FileOutputStream( this.rutaArchivoPersistencia ) );
		    accesoADatos.writeObject( proyectos );
		    accesoADatos.close( );
		}
		catch( IOException e )
		{
		    throw e;
		}
	}
	
	/**
	 * Lista los proyectos del Sistema
	 * @return
	 * @throws Exception
	 */
	@Loc(size=13, taskId=4)
	@SuppressWarnings("unchecked")
	public List<Proyecto> listar() throws Exception
	{
		List<Proyecto> proyectos = new ArrayList<Proyecto>();
		
		try
		{
		    ObjectInputStream accesoADatos = new ObjectInputStream( new FileInputStream( this.rutaArchivoPersistencia ) );
		    Object obj = accesoADatos.readObject( );
		    proyectos = (ArrayList<Proyecto>)obj;
		    accesoADatos.close( );
		}
		catch( Exception e )
		{
		    throw e;
		}
		
		return proyectos;
	}
	
}
